package com.tedu.day02.oop;

import java.security.PublicKey;

/**
 * 抽象特点<补充>
 * 类：成员变量/成员方法/构造方法
 *   抽象类：成员变量/成员方法/构造方法
 *   成员变量：既可以变量，也可以常量
 *   构造方法：有，用于子类调用抽象【父】类的成员变量---赋值
 *   成员方法：既可以抽象，非抽象
 *   抽象方法与非抽象方法出现在抽象类问题：
 *   A：抽象方法  【重写】强制要求子类完成父类抽象方法
 *   B：非抽象方法 【拓展】子类继承的事情，提高代码复用性
 */
abstract class Foo{
    //成员变量
    public int i=10;
    public final int J=20;//成员变量：常量 常量标识符大写
    //Java属于强类型语言：大小写分明
//    public int j=30;
    //构造方法 无参

    public Foo() {
        this(30);//调用当前类对象的其它构造器 //调用当前静态对象的其它构造器
    }
    public Foo(int i){
        this.i=i;
    }
    //成员方法：抽象方法
    public abstract void show();
    //成员方法：非抽象方法
    public void method(){
        System.out.println("Foo    method");
    }

}
//实现 {子类}
class Goo extends Foo{
    public void show() {
        System.out.println("Goo show");
    }
    public void method(){
        System.out.println("Goo method");
    }
}
public class 抽象类补充知识点 {
    public static void main(String[] args) {
        //抽象类---继承---多态---向上造型
        Foo f=new Goo();
        //①实例化---子类的构造器,默认存在无参构造器【自带super】
        //再通过super()调用父类无参构造器
        //②执行抽象类无参构造器，发现有this(参数)调用本类其他有参数构造器
        //③this调用的同时，完成对抽象类中 i 进行赋值 i=30
        System.out.println(f.i);//④输出：i的值 30
        //f.J=40;不可修改
        System.out.println(f.J);
        //------
        f.show();  //输出：Goo show 重写
        f.method();//输出：Goo show 拓展【子类方法重写】
    }
}
/*拓展：abstract 关键字共存问题 */
abstract class Aoo{
//    private abstract void show1(); //冲突
//    public final abstract void show2(); //冲突
//    public static abstract void  show3();  //无意义：二选一 要么静态方法(需要加语法块{})要么抽象方法
}

